package com.baizhi.cmfz.controller;

import com.baizhi.cmfz.annotation.LogAnnotation;
import com.baizhi.cmfz.entity.Guru;
import com.baizhi.cmfz.service.GuruService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("guru")
public class GuruController {
    @Autowired
    private GuruService guruService;

    /**
     * layui 做分页 从前台传来连个参数 一个是当前页page，一个是查询是的数据
     * @param page
     * @param limit
     * @return
     */
    @RequestMapping("selectGuru")
    @LogAnnotation(value = "分页查询上师信息",type = "select")
    public Map selectGuru(int page,int limit) {
        return guruService.selectGuru(page,limit);
    }

    /**
     * 添加上师信息时 需要用到文件上传，使用ajax技术完成前台的文件的处理
     * 普通的数据使用对应的对象接收
     * 通过spring提供的文件上传工具类完成文件上传
     * @param guru
     * @param guruImg
     * @param request
     * @return
     */
    @RequestMapping("addGuru")
    @LogAnnotation(value = "添加上师信息",type = "insert")
    public Map addGuru(Guru guru, MultipartFile guruImg, HttpServletRequest request) throws IOException {
        //先获取到文件要上传的绝对路径
        String realPath = request.getServletContext().getRealPath("img");
        //为了防止文件上传时的重名问题给文件名加上一个UUID字符串
        String fileName = UUID.randomUUID()+"-"+guruImg.getOriginalFilename();
        //将文件上传到对应的文件夹中
        guruImg.transferTo(new File(realPath+"/"+fileName));
        //将文件的相对路径存入对象中
        guru.setGuruImage("/img/"+fileName);
        Map map = guruService.addGuru(guru);
        return map;
    }

    /**
     * 删除数据
     * @param guruId
     * @return
     */
    @RequestMapping("deleteGuru")
    @LogAnnotation(value = "删除上师信息",type = "delete")
    public Map deleteGuru(int guruId) {
        Map map = guruService.deleteGuru(guruId);
        return map;
    }

    /**
     * 在修改之前需要先将一个上师的信息查询出来展示到form表单中
     * @param guruId
     * @return
     */
    @RequestMapping("selectOneGuru")
    @LogAnnotation(value = "查询一条上师信息",type = "select")
    public Guru selectOneGuru(int guruId) {
        Guru guru = guruService.selectOneGuru(guruId);
        return guru;
    }

    /**
     * 修改时存在两种情况 当修改了图片，再去进行一次文件上传，
     * 如果没有对文件进行修改 就不用再去进行文件上传了
     * 当文件没有上传时 multipartFile接收的file 的文件名是一个空的字符串
     * 以此来判断是不是需要进行文件上传以及修改文件路径
     * @param guru
     * @param guruImg
     * @param request
     * @return
     */
    @RequestMapping("updateGuru")
    @LogAnnotation(value = "更新上师信息",type = "update")
    public Map updateGuru(Guru guru,MultipartFile guruImg,HttpServletRequest request) throws IOException {
        //判断是否需要文件上传
        if (!guruImg.getOriginalFilename().equals("")) {
            //说明图片进行修改 需要文件上传
            //获取要上传到的文件夹的真实路径
            String realPath = request.getServletContext().getRealPath("img");

            //防止文件重复给文件添加一个随机的UUID
            String fileName = UUID.randomUUID()+"-"+guruImg.getOriginalFilename();
            //上传文件
            guruImg.transferTo(new File(realPath+"/"+fileName));
            //将文件的相对路径存入对象中 到数据库中做对应的修改
            guru.setGuruImage("/img/"+fileName);
        }else {
            guru.setGuruImage(null);
        }
        Map map = guruService.updateGuru(guru);
        return map;
    }

    /**
     * 点击解冻或者冻结按钮时，在后台做对应的状态更改
     * 页面需要传递来两个参数，一个是上师的id 一个是上师当前的状态值
     * @param guruId
     * @param guruStatus
     * @return
     */
    @RequestMapping("updateGuruStatus")
    @LogAnnotation(value = "更改上师状态",type = "update")
    public Map updateGuruStatus(int guruId,int guruStatus) {
        Map map = guruService.updateGuruStatus(guruId,guruStatus);
        return map;
    }

    /**
     * 批量添加时 需要先将文件上传到服务器指定的文件夹下
     * 然后获取到对应的文件通过POI完成批量添加
     * 参数是上传上来的文件
     * request 用来获取绝对路径
     * @param mutilGuru
     * @param request
     * @return
     */
    @RequestMapping("multiAddGuru")
    @LogAnnotation(value = "批量删除上师",type = "delete")
    public Map multiAddGuru(MultipartFile mutilGuru, HttpServletRequest request) throws IOException {
        //获取要上传的到的文件夹的所在路径
        String realPath = request.getServletContext().getRealPath("file");

        //获取文件名
        String fileName = mutilGuru.getOriginalFilename();
        //进行文件上传
        mutilGuru.transferTo(new File(realPath+"/"+fileName));
        //确定文件上传之后的文件的肚饿对路径
        String filePath = realPath+"/"+fileName;
        Map map = guruService.multiAddGuru(filePath);
        return map;
    }

    /**
     * 文件导出成功后再页面有对应的提醒
     * @return
     */
    @RequestMapping("downLoadGuru")
    @LogAnnotation(value = "导出上师信息",type = "select")
    public Map downLoadGuru() throws IOException, IllegalAccessException {
        Map map = guruService.downLoadGuru();
        return map;
    }
}
